package com.codeblock_;

/**
 * @Author 小闽
 * @Date 2024/9/9 9:42
 * @PackageName: com.codeblock_
 * @ClassName: CodeBlockDetail04
 * @Description: 代码块细节04
 * @Version 1.0
 */
public class CodeBlockDetail04 {
    public static void main(String[] args) {
        // 实例一个B02对象
        // 运行顺序为：
        // 1、A02的静态方法被执行...
        // 2、A02的静态代码块被执行...
        // 3、B02静态方法被执行...
        // 4、B02静态代码块被执行...
        // 5、A02的非静态代码块被执行...
        // 6、A02的非静态方法被执行...
        // 7、A02的构造方法被执行...
        // 8、B02非静态代码块被执行...
        // 9、B02非静态方法被执行...
        // 10、B02的构造方法被执行...
        B02 b02 = new B02();
        C02 c02 = new C02();
    }
}
//静态代码块只能直接调用静态成员（静态属性和静态方法），普通代码块可以调用任意成员。
class C02{
    private static int n1 = 100;
    private int n2 = 200;
    static{
        System.out.println("C02静态代码块被执行...");
        getValC01(); // 可以
        //getValC02() // 不可以
        System.out.println(n1); // 可以
        //System.out.println(n2); // 错误
    }
    {
        System.out.println("C02非静态代码块被执行...");
        getValC01(); // 可以
        getValC02(); // 可以
        System.out.println(n1); // 可以
        System.out.println(n2); // 可以
    }
    public static int getValC01(){
        System.out.println("C02静态方法被执行");
        return 100;
    }
    public int getValC02(){
        System.out.println("C02非静态代码块被执行...");
        return 200;
    }

}
// 父类
class A02{
    // 静态属性
    private static int n1 = getValA01();
    // 静态代码块
    static{
        System.out.println("A02的静态代码块被执行...");
    }
    {
        System.out.println("A02的非静态代码块被执行...");
    }
    // 非静态属性
    private int n3 = getA02();
    // 静态方法
    public static int  getValA01(){
        System.out.println("A02的静态方法被执行...");
        return 100;
    }
    // 非静态方法
    public int getA02(){
        System.out.println("A02的非静态方法被执行...");
        return 200;
    }
    /**
     * 构造方法
     */
    public A02() {
        System.out.println("A02的构造方法被执行...");
    }
}

// 子类
class B02 extends A02{
    // 静态属性
    private static int n2 = getValB01();
    // 静态代码块
    static{
        System.out.println("B02静态代码块被执行...");
    }
    // 非静态代码块
    {
        System.out.println("B02非静态代码块被执行...");
    }
    // 非静态属性
    private int n4 = getValB02();
    // 静态方法
    public static int getValB01(){
        System.out.println("B02静态方法被执行...");
        return 300;
    }
    // 非静态方法
    public int getValB02(){
        System.out.println("B02非静态方法被执行...");
        return 400;
    }

    /**
     * 构造方法
     */
    public B02() {
        System.out.println("B02的构造方法被执行...");
    }
}